using System;
using System.Collections.Generic;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FEL.ACT;
using Koala.KoalaWebControls;

public partial class ACT_ACT_UBICACION : PaginaBaseTreeGrid
{
    //int i;
    private int _i
    {
        get
        {
            object o = ViewState["indice"];
            return (o == null) ? 0 : (int)o;

        }
        set
        {
            ViewState["indice"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ActualizarDatos();
            string UbicacionId = Request.QueryString.Get("Act_Ubicacion_Id");
            if (UbicacionId != null)
            {
                frvActUbicacion.DefaultMode = FormViewMode.ReadOnly;
                AsignarParametrosDataSourceDeatailsView(UbicacionId);
            }
            else
            {
                BloquearFrv();
            }
        }

        odsActUbicacion.Inserted += new ObjectDataSourceStatusEventHandler(odsActUbicacion_Inserted);
        odsActUbicacion.Deleted += new ObjectDataSourceStatusEventHandler(odsActUbicacion_Deleted);
        odsActUbicacion.Updated += new ObjectDataSourceStatusEventHandler(odsActUbicacion_Updated);

        frvActUbicacion.DataBound += new EventHandler(frvActUbicacion_DataBound);
        frvActUbicacion.ModeChanging += new FormViewModeEventHandler(frvActUbicacion_ModeChanging);
        trvActUbicacion.SelectedNodeChanged += new EventHandler(trvActUbicacion_SelectedNodeChanged);

        Btn_Act_Ubicacion_Personal.Click += new EventHandler(Btn_Act_Ubicacion_Personal_Click);

        base.Page_Load(sender, e);
    }

    void Btn_Act_Ubicacion_Personal_Click(object sender, EventArgs e)
    {
        string idUbicacion = ((TextBox) Frv.FindControl("Id")).Text;
        string codigoUbicacion = ((TextBox)Frv.FindControl("Codigo")).Text;
        string nombreUbicacion = ((TextBox)Frv.FindControl("Nombre")).Text;

        Response.Redirect("~/ACT/ACT_UBICACION_PERSONAL.aspx" +
            "?Act_Ubicacion_Id=" + idUbicacion + 
            "&Act_Ubicacion_Codigo=" + codigoUbicacion +
            "&Act_Ubicacion_Nombre=" + nombreUbicacion);

    }

    void frvActUbicacion_DataBound(object sender, EventArgs e)
    {
        Btn_Act_Ubicacion_Personal.Enabled = true;
        if( Frv.CurrentMode == FormViewMode.ReadOnly )
        {
            if (Frv.DataKey["Act_Ubicacion_Id"] == null)
            {
                DeshabilitarBoton("DeleteButton");
                Btn_Act_Ubicacion_Personal.Enabled = false;
            }
        }

        if( Frv.CurrentMode == FormViewMode.Insert)
        {
            Btn_Act_Ubicacion_Personal.Enabled = false;
        }

        if (_i < 4)
        {
            if (Frv.CurrentMode == FormViewMode.ReadOnly)
            {
                HabilitarBoton1("NewButton");
            }
        }

        if (_i >= 4)
        {
            if (Frv.CurrentMode == FormViewMode.ReadOnly)
            {
                DeshabilitarBoton1("NewButton");
            }
        }       
    }

    void HabilitarBoton1(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = true;
    }

    void DeshabilitarBoton1(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void DeshabilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void odsActUbicacion_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();

            ActualizarDatos();

            string nuevoNodo = e.ReturnValue.ToString();

            if (valuePath != null)
                ExpandirPath(trvActUbicacion, valuePath + trvActUbicacion.PathSeparator + nuevoNodo, true);

            _i = trvActUbicacion.SelectedNode.Depth;

            ViewState["trvActClaseValuePath"] = trvActUbicacion.SelectedNode.ValuePath;
            udpTrv.Update();
        }
    }

    void odsActUbicacion_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                //int i = ;
                valuePath = valuePath.Remove(valuePath.LastIndexOf(trvActUbicacion.PathSeparator));
                ActualizarDatos();
                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvActUbicacion, valuePath, false);
                }

            }

            ViewState["trvActClaseValuePath"] = null;
            BloquearFrv();
            udpTrv.Update();
        }
    }

    void odsActUbicacion_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                ActualizarDatos();

                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvActUbicacion, valuePath, true);
                }
            }
            ViewState["trvActClaseValuePath"] = trvActUbicacion.SelectedNode.ValuePath;
            udpTrv.Update();
        }
    }

    void ExpandirPath(TreeView trv, string valuePath, bool selecionarUltimoNodo)
    {
        TreeNode nodo = trv.FindNode(valuePath);
        if (selecionarUltimoNodo)
            nodo.Select();
        while (nodo != null)
        {
            nodo.Expand();
            nodo = nodo.Parent;
        }
    }

    void trvActUbicacion_SelectedNodeChanged(object sender, EventArgs e)
    {
        ViewState["trvActClaseValuePath"] = trvActUbicacion.SelectedNode.ValuePath;
        Frv.Enabled = true;

        _i = trvActUbicacion.SelectedNode.Depth;
    }

    void BloquearFrv()
    {
        Frv.Enabled = false;
    }

    protected override Type TipoObjeto
    {
        get { return typeof(Act_Ubicacion); }
    }

    protected override TreeView Trv
    {
        get { return trvActUbicacion; }
    }

    protected override FormView Frv
    {
        get { return frvActUbicacion; }
    }

    protected override ObjectDataSource OdsFrv
    {
        get { return odsActUbicacion; }
    }

    protected override Button ResponderZoom
    {
        get { return Seleccionar; }
    }

    protected override Button RegresoZoom
    {
        get { return Atras; }
    }

    protected override KFiltro Filtro
    {
        get { return null; }
    }

    protected override string Contenedor
    {
        get { return "ACT_UBICACION"; }
    }

    void ActualizarDatos()
    {
        trvActUbicacion.Nodes.Clear();
        List<Act_Ubicacion> lstMetaLista = ObtenerMetadatosArbol((Scope)Session["Scope"]);
        ArmarArbol(trvActUbicacion.Nodes, lstMetaLista, null);
    }

    void frvActUbicacion_ModeChanging(object sender, FormViewModeEventArgs e)
    {
        if (frvActUbicacion.CurrentMode == FormViewMode.ReadOnly &&
            e.NewMode == FormViewMode.Insert)
        {
            _id = ObtenerText("Id");
            _codigo = ObtenerText("Codigo");
            _nombre = ObtenerText("Nombre");
        }
    }

    private string _id = string.Empty;
    private string _nombre = string.Empty;
    private string _codigo = string.Empty;

    protected override void DefinirParametrosFijosDeInsercion(List<DictionaryEntry> param)
    {
        if (!string.IsNullOrEmpty(_id))
        {
            param.Add(new DictionaryEntry("Act_Ubicacion_Id", _id));
            param.Add(new DictionaryEntry("Act_Ubicacion_Codigo", _codigo));
            param.Add(new DictionaryEntry("Act_Ubicacion_Nombre", _nombre));
            
        }
    }

    string ObtenerText(string idTextBox)
    {
        return ((TextBox)Frv.FindControl(idTextBox)).Text;
    }

    private List<Act_Ubicacion> ObtenerMetadatosArbol(Scope s)
    {
        BO_Act_Ubicacion boActUbicacion = new BO_Act_Ubicacion();

        List<Act_Ubicacion> lstActUbicacion = null;
        try
        {
            lstActUbicacion = boActUbicacion.GetByEmpresa("Nombre", (Scope)Session["Scope"]);
        }
        catch
        {

        }
        return lstActUbicacion;
    }

    private void ArmarArbol(TreeNodeCollection raiz, List<Act_Ubicacion> lstArbolMetaDatos, string IdPadre)
    {
        List<Act_Ubicacion> nuevosNodos = SacarHijos(IdPadre, lstArbolMetaDatos);
        for (int indiceNuevo = 0; indiceNuevo < nuevosNodos.Count; indiceNuevo++)
        {
            TreeNode nuevoNodo = AgregarNodo(nuevosNodos[indiceNuevo], raiz);
            ArmarArbol(nuevoNodo.ChildNodes, lstArbolMetaDatos, nuevosNodos[indiceNuevo].Id);
        }
    }

    private TreeNode AgregarNodo(Act_Ubicacion metaNodoHijo, TreeNodeCollection raizNodo)
    {
        TreeNode nodoHijo = new TreeNode(metaNodoHijo.Nombre, metaNodoHijo.Id);
        nodoHijo.SelectAction = TreeNodeSelectAction.Select;
        nodoHijo.PopulateOnDemand = false;
        raizNodo.Add(nodoHijo);
        return nodoHijo;
    }

    private List<Act_Ubicacion> SacarHijos(string padreId, List<Act_Ubicacion> lstMetadatos)
    {
        List<Act_Ubicacion> lstHijosObtenidos = new List<Act_Ubicacion>();
        for (int indice = 0; indice < lstMetadatos.Count; indice++)
        {
            if (lstMetadatos[indice].Act_Ubicacion_Id == padreId)
            {
                lstHijosObtenidos.Add(lstMetadatos[indice]);
                lstMetadatos.RemoveAt(indice);
                indice--;
            }
        }
        return lstHijosObtenidos;
    }
}
